package com.moujitx.wecom.service;

import java.util.Optional;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.moujitx.wecom.common.Result;
import com.moujitx.wecom.common.Wecom;
import com.moujitx.wecom.entity.WecomConfig;
import com.moujitx.wecom.repository.WecomConfigRepository;

/**
 * 消息服务类，用于处理不同类型的消息发送
 */
@Service
public class MessageService {

    @Autowired
    private WecomConfigRepository wecomConfigRepository;
    
    /**
     * 发送文本消息
     * 
     * @param destinationId 目的地ID
     * @param content 消息内容
     * @return 发送结果
     */
    public Result sendTextMessage(Long destinationId, String content) {
        Optional<WecomConfig> configOpt = wecomConfigRepository.findById(destinationId);
        
        if (!configOpt.isPresent()) {
            return Result.serverError("目的地ID不存在: " + destinationId);
        }
        
        WecomConfig config = configOpt.get();
        
        if (!config.getEnabled()) {
            return Result.serverError("目的地已禁用: " + destinationId);
        }
        
        String accessToken = Wecom.getAccessToken(config.getCorpId(), config.getSecret());
        if (accessToken == null) {
            return Result.serverError("获取访问令牌失败");
        }
        
        String result = Wecom.sendTextMessage(accessToken, "@all", content, config.getAgentId(), config.getId());
        return Result.ok(result);
    }
    
    /**
     * 发送Markdown消息
     * 
     * @param destinationId 目的地ID
     * @param content Markdown内容
     * @return 发送结果
     */
    public Result sendMarkdownMessage(Long destinationId, String content) {
        Optional<WecomConfig> configOpt = wecomConfigRepository.findById(destinationId);
        
        if (!configOpt.isPresent()) {
            return Result.serverError("目的地ID不存在: " + destinationId);
        }
        
        WecomConfig config = configOpt.get();
        
        if (!config.getEnabled()) {
            return Result.serverError("目的地已禁用: " + destinationId);
        }
        
        String accessToken = Wecom.getAccessToken(config.getCorpId(), config.getSecret());
        if (accessToken == null) {
            return Result.serverError("获取访问令牌失败");
        }
        
        String result = Wecom.sendMarkdownMessage(accessToken, "@all", content, config.getAgentId(), config.getId());
        return Result.ok(result);
    }
    
    /**
     * 发送图文消息
     * 
     * @param destinationId 目的地ID
     * @param title 标题
     * @param description 描述
     * @param url 跳转链接
     * @param picUrl 图片链接
     * @return 发送结果
     */
    public Result sendNewsMessage(Long destinationId, String title, String description, String url, String picUrl) {
        Optional<WecomConfig> configOpt = wecomConfigRepository.findById(destinationId);
        
        if (!configOpt.isPresent()) {
            return Result.serverError("目的地ID不存在: " + destinationId);
        }
        
        WecomConfig config = configOpt.get();
        
        if (!config.getEnabled()) {
            return Result.serverError("目的地已禁用: " + destinationId);
        }
        
        String accessToken = Wecom.getAccessToken(config.getCorpId(), config.getSecret());
        if (accessToken == null) {
            return Result.serverError("获取访问令牌失败");
        }
        
        String result = Wecom.sendNewsMessage(accessToken, "@all", title, description, url, picUrl, config.getAgentId(), config.getId());
        return Result.ok(result);
    }
    
    /**
     * 发送模板卡片消息
     * 
     * @param destinationId 目的地ID
     * @param title 标题
     * @param description 描述
     * @param url 跳转链接
     * @return 发送结果
     */
    public Result sendTemplateCardMessage(Long destinationId, String title, String description, String url) {
        Optional<WecomConfig> configOpt = wecomConfigRepository.findById(destinationId);
        
        if (!configOpt.isPresent()) {
            return Result.serverError("目的地ID不存在: " + destinationId);
        }
        
        WecomConfig config = configOpt.get();
        
        if (!config.getEnabled()) {
            return Result.serverError("目的地已禁用: " + destinationId);
        }
        
        String accessToken = Wecom.getAccessToken(config.getCorpId(), config.getSecret());
        if (accessToken == null) {
            return Result.serverError("获取访问令牌失败");
        }
        
        cn.hutool.json.JSONObject result = Wecom.sendTemplateCardMessage(accessToken, "@all", title, description, url, config.getAgentId(), config.getId());
        
        if (result.getBool("success")) {
            return Result.ok(result.get("data"));
        } else {
            return Result.serverError(result.getJSONObject("data").getStr("errmsg"));
        }
    }
    
    /**
     * 根据消息类型发送消息
     * 
     * @param destinationId 目的地ID
     * @param messageType 消息类型（text, markdown, news, template_card）
     * @param content 消息内容
     * @param title 标题（用于news和template_card类型）
     * @param description 描述（用于news和template_card类型）
     * @param url 跳转链接（用于news和template_card类型）
     * @param picUrl 图片链接（用于news类型）
     * @return 发送结果
     */
    public Result sendMessage(Long destinationId, String messageType, String content, 
            String title, String description, String url, String picUrl) {
        
        switch (messageType.toLowerCase()) {
            case "text":
                return sendTextMessage(destinationId, content);
            case "markdown":
                return sendMarkdownMessage(destinationId, content);
            case "news":
                return sendNewsMessage(destinationId, title, description, url, picUrl);
            case "template_card":
                return sendTemplateCardMessage(destinationId, title, description, url);
            default:
                return Result.serverError("不支持的消息类型: " + messageType);
        }
    }
}